Package org.python.pydev.refactoring.codegenerator.generateproperties.edit

Source Code of org.python.pydev.refactoring.codegenerator.generateproperties.edit.PropertyEdit

/*
* Copyright (C) 2006, 2007  Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007  Reto Schuettel, Robin Stocker
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
*
*/

package org.python.pydev.refactoring.codegenerator.generateproperties.edit;

import java.util.ArrayList;
import java.util.List;

import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.jython.ast.Assign;
import org.python.pydev.parser.jython.ast.Call;
import org.python.pydev.parser.jython.ast.Name;
import org.python.pydev.parser.jython.ast.Str;
import org.python.pydev.parser.jython.ast.exprType;
import org.python.pydev.parser.jython.ast.str_typeType;
import org.python.pydev.refactoring.codegenerator.generateproperties.request.GeneratePropertiesRequest;
import org.python.pydev.refactoring.codegenerator.generateproperties.request.SelectionState;
import org.python.pydev.refactoring.core.edit.AbstractInsertEdit;

/**
* Creates the property:
*
* <pre>
*    attribute = property(get_attribute, set_attribute, del_attribute, "attribute's docstring")
* </pre>
*/
public class PropertyEdit extends AbstractInsertEdit {

    private static final Name NONE = new Name("None", Name.Load, true);
    private static final Name PROPERTY = new Name("property", Name.Load, false);

    private GeneratePropertiesRequest request;

    private String attributeName;
    private String propertyName;

    private SelectionState state;

    private int offsetStrategy;

    public PropertyEdit(GeneratePropertiesRequest req) {
        super(req);
        this.request = req;
        this.attributeName = req.getAttributeName();
        this.propertyName = req.getPropertyName();
        this.state = req.getSelectionState();
        this.offsetStrategy = req.offsetPropertyStrategy;
    }

    @Override
    protected SimpleNode getEditNode() {
        exprType[] target = new exprType[] { new Name(propertyName, Name.Store, false) };
        Call property = createPropertyCall();

        return new Assign(target, property);
    }

    private Call createPropertyCall() {
        exprType[] args = createPropertyArguments();
        Call property = new Call(PROPERTY, args, null, null, null);
        return property;
    }

    private exprType[] createPropertyArguments() {
        List<exprType> args = new ArrayList<exprType>();

        addArgument(args, state.isGetter(), "get");
        addArgument(args, state.isSetter(), "set");
        addArgument(args, state.isDelete(), "del");
        if (state.isDocstring()) {
            args.add(new Str(propertyName + "'s docstring", str_typeType.SingleDouble, false, false, false));
        } else {
            args.add(NONE);
        }

        return args.toArray(new exprType[args.size()]);
    }

    private void addArgument(List<exprType> args, boolean isAvailable, String accessType) {
        if (isAvailable) {
            args.add(new Name(request.getAccessorName(accessType, attributeName), Name.Load, false));
        } else {
            args.add(NONE);
        }
    }

    @Override
    public int getOffsetStrategy() {
        return offsetStrategy;
    }

}
TOP

Related Classes of org.python.pydev.refactoring.codegenerator.generateproperties.edit.PropertyEdit

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.